package com.search;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.apache.lucene.document.Document;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.ScoreDoc;

import com.common.FIELDS;

public class DocumentFormatter {

	/**
	 * les da un formato a los documentos encontrados y los almacena en un
	 * string.
	 * 
	 * @param documents
	 *            la lista de ScoreDocs
	 * @param indexSearcher
	 *            el index
	 * @return un set de strings con los docuemntos formateados para imprimirse.
	 * @throws CorruptIndexException
	 * @throws IOException
	 */
	public static Set<String> formatDocuments(Set<ScoreDoc> documents,
			IndexSearcher indexSearcher) throws CorruptIndexException,
			IOException {

		Set<String> formattedDocs = new HashSet<String>();

		List<ScoreDoc> documentsList = new ArrayList<ScoreDoc>(documents);
		Collections.sort(documentsList, new ScoreDocComparator());

		// por cada documento.
		for (ScoreDoc scoreDoc : documentsList) {

			StringBuffer formattedDoc = new StringBuffer();

			// busca el documento q retornó la busqueda
			Document document = indexSearcher.doc(scoreDoc.doc);

			// por cada field busca los values y los agrega al buffer
			for (FIELDS field : FIELDS.values()) {

				// valores.
				String[] values = document.getValues(field.toString());

				if (values.length > 0) { // si tiene algun valor.

					// nombre del field.
					formattedDoc.append(field.toString().toUpperCase()).append(
							": ");

					for (int i = 0; i < values.length; i++) {

						if (i > 0) formattedDoc.append(", ");

						formattedDoc.append(values[i]);
					}
					formattedDoc.append(". ");
				}
			}
			// agrega el puntaje.
			formattedDoc.append("SCORE: ").append(scoreDoc.score)
					.append(". \n");

			// se agrega el documento formateado al set de documentos.
			formattedDocs.add(formattedDoc.toString());
		}
		return formattedDocs;
	}
}
